package kgame5.k3d.core.obj3d.hardvo {
import kgame5.k3d.core.math.Vector3D;
import kgame5.k3d.core.obj3d.bound.AABB;
import kgame5.k3d.core.obj3d.bound.BBall;

/**
 * @author kangkai
 * 一个"刚体"的vo,注意这里说刚体是相对于有posture的东西而言的
 * 
 * 这个vo很有用，在XPosiM和RotationManager里都要用到
 * 
 * 这个代表游戏中的一个刚体的数据对象
 * 
 * 注意一定要设置ABH R!!
 */
public class HardVO {
	public var id:int;//四叉树用的
	public var dataObj:Object;//描述一些其他信息用的
	
	//这两个是用来单元格子用的，寻径或者做一些碰撞啥的，实践表明，挺有用的
	public var 
		_col:int,
		_row:int;
	
	//是否可见，不可见就不画
	public var visible:Boolean=true;
	
	//--物理尺寸,边界
	public var aabb:AABB=new AABB();
	public var bball:BBall=new BBall();
	
	//重量，这个是爆炸的时候用的,目前是粒子系统要用
	public var weight:Number=1;
	
	//移动
	public var v3d_p:Vector3D=new Vector3D();
	public var v3d_v:Vector3D=new Vector3D();
	public var v3d_a:Vector3D=new Vector3D();
	
	//旋转
	public var v3d_r:Vector3D=new Vector3D();//x是绕x轴的，y是绕y轴的，z是绕z轴的，
	public var v3d_rv:Vector3D=new Vector3D();//旋转速度
	public var v3d_ra:Vector3D=new Vector3D();//旋转的加速度
	
	//缩放
	public var v3d_s:Vector3D=new Vector3D(1,1,1);//100是不进行缩放，原来的比例
	public var v3d_sv:Vector3D=new Vector3D();
	public var v3d_sa:Vector3D=new Vector3D();
	
	//小人跳跃箱子使用的,影子也在用这个
	public var floorAltitude:Number=0;
	
	//这个是表示尝试加到指定位置是否有效，有碰撞就是无效的
	public var 
		bXok:Boolean=false,
		bYok:Boolean=false,
		bZok:Boolean=false;
	
	//临时用的，
	public var _preP:Vector3D=new Vector3D();//保持上一个位置
	public var _preV:Vector3D=new Vector3D();//保持上一个位置
		
	//逻辑需要用到的,以长方体中心点来碰撞
	public function HitTestAABB(aim:HardVO):Boolean{
		
	    if (visible && aim.visible){ 
	         if(
//	         	Math.abs(v3d_p.x-aim.v3d_p.x) <(( aabb.A + aim.aabb.A)/2)) 
//	         	&& (Math.abs(v3d_p.z -aim.v3d_p.z) <( (aabb.B + aim.aabb.B)/2))
//	         	&& (Math.abs(v3d_p.y -aim.v3d_p.y) <( (aabb.H + aim.aabb.H)/2))
					(Math.abs(v3d_p.x-aim.v3d_p.x)*2 <( aabb.A + aim.aabb.A)) 
	         	&& (Math.abs(v3d_p.z -aim.v3d_p.z)*2 <( aabb.B + aim.aabb.B))
	         	&& (Math.abs(v3d_p.y -aim.v3d_p.y)*2 <( aabb.H + aim.aabb.H))
	         ) {
				return true;
	         }else{
	         	return false;
	         }
	     } else {
	       return false;
	     }	
	}
	
	//这个很常用，做爆炸检测的时候使用这个
	public function HitTestBBall(aim:HardVO):Boolean{
		//T.p((v3d_p.x-aim.v3d_p.x)+" "+(v3d_p.z -aim.v3d_p.z));
	    if (visible && aim.visible) {
	    	var threahold:Number = this.bball.R + aim.bball.R;
			var dist2:Number = Vector3D.SGetDistance2(this.v3d_p, aim.v3d_p);
			
			if(dist2<threahold*threahold){
				return true;
			}else{
				return false;
			}
			
	     } else {
	       return false;
	     }	
	}
	
	public function toString():String{
		return "p:"+v3d_p;
	}
}//end of class
}
